package exercicios_threads.threads_aracaju.corrida_sapos;
/**
 * <h2>Exercício - Thread</h2>
 * Classe que simula uma corrida de sapos usando Threads.
 * 
 * @author dennisxsf@gmail.com - Dennis Fernandes
 * @version
 * 			<p><b>v1.0 (07/09/2014) - Dennis Fernandes</b><br>
 * 				- Criacao da classe SapoCorrendo.<br>
 * 				- Criacao dos atributos.<br>
 * 				- Criacao do construtor.<br>
 * 				- Criacao do metodo {@link #sapoImprimindoSituacao()}
 * 				- Criacao do metodo {@link #sapoPulando()}
 * 				- Criacao do metodo {@link #sapoDescansando()}
 * 				- Criacao do metodo {@link #colocacaoSapo()}
 * 				- Sobrescrita do metodo {@link #run()}
 * 			</p>
 */
public class SapoCorrendo extends Thread {
	
	private String nome;						// Nome do sapo
	private int distanciaCorrida = 0;			// Distancia ja corrida pelo sapo
	private int distanciaTotalCorrida;			// Distancia a ser corrida pelo sapo
	private int pulo = 0;						// Pulo do sapo em cm
	private int pulos = 0;						// Quantidade de pulos dados na corrida
	private static int colocacao = 0;			// Colocacao do sapo ao final da corrida
	private final static int PULO_MAXIMO = 50;	// Pulo maximo em que um sapo pode dar
	/**
	 * Construtor
	 * 
	 * @param nome
	 * @param distanciaTotalCorrida
	 */
	public SapoCorrendo(String nome, int distanciaTotalCorrida) {
		this.nome = nome;
		this.distanciaTotalCorrida = distanciaTotalCorrida;
	}
	/**
	 * Imprime o ultimo pulo do sapo e a distancia percorrida
	 */
	public void sapoImprimindoSituacao() {
		System.out.println(
			"O "+nome+" pulou "+pulo+"cm \t e já percorreu "+distanciaCorrida+"cm"
		);
	}
	/**
	 * Faz o sapo pular
	 */
	public void sapoPulando() {
		pulos++;
		pulo = (int) (Math.random() * PULO_MAXIMO);
		distanciaCorrida += pulo;
		if(distanciaCorrida > distanciaTotalCorrida) {
			distanciaCorrida = distanciaTotalCorrida;
		}
	}
	/**
	 * Representando o descanso do sapo
	 */
	public void sapoDescansando() {
		yield();	// Metodo que passa a vez a outras threads
	}
	/**
	 * Imprime a colocacao do sapo ao final da corrida
	 */
	public void colocacaoSapo() {
		colocacao++;
		System.out.println(
			nome + " foi o " + colocacao + " colocado com " + pulos + " pulos."
		);
	}
	/**
	 * Metodo run da Thread CorridaDeSapos
	 */
	public void run() {
		while(distanciaCorrida < distanciaTotalCorrida) {
			sapoPulando();
			sapoImprimindoSituacao();
			sapoDescansando();
		}
		colocacaoSapo();
	}
}
